# 导入Pydantic的BaseModel、Field和validator，用于定义数据模型和字段验证
from pydantic import BaseModel, Field, ValidationError, field_validator

# 导入datetime用于时间字段
from datetime import datetime

# 导入List和Optional类型提示
from typing import List, Optional


# 定义用户数据模型，继承自BaseModel
class User(BaseModel):
    # 用户ID，整数类型
    id: int
    # 用户名，字符串类型，长度1-50，必填
    name: str = Field(..., min_length=1, max_length=50)
    # 邮箱，字符串类型，必须符合正则表达式格式
    email: str = Field(..., pattern=r"^[^@]+@[^@]+\.[^@]+$")
    # 年龄，可选整数，范围0-150
    age: Optional[int] = Field(None, ge=0, le=150)
    # 创建时间，默认为当前时间
    created_at: datetime = Field(default_factory=datetime.now)

    # 定义name字段的自定义验证器
    @field_validator("name")
    def name_must_startswith_user(cls, v):
        # 去除空白后判断是否为空
        if not v.strip().startswith("user"):
            raise ValueError("姓名必须以user开头")
        # 返回去除空白后的字符串
        return v.strip()

    # 配置类
    class Config:
        # 赋值时自动验证字段
        validate_assignment = True
        # 禁止出现未声明的额外字段
        extra = "forbid"


# 使用示例
try:
    # 创建User对象，传入各字段
    user = User(id=1, name="user_222", email="lisi@example.com", age=30)
    # 打印为字典格式
    print(user.model_dump())
    # 打印为JSON格式
    print(user.model_dump_json())
# 捕获验证异常
except ValidationError as e:
    # 打印验证失败信息
    print(f"验证失败: {e}")
